package com.example.memento.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Builder;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 领域词对象
 * 表示在特定领域中的词及其解释
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public class DomainWord {
    
    /**
     * 领域名称（如：医学、法律、计算机等）
     */
    @NotBlank(message = "领域名称不能为空")
    @Size(max = 100, message = "领域名称长度不能超过100个字符")
    private String domainName;
    
    /**
     * 词在该领域中的特定含义/用法
     */
    @Size(max = 1000, message = "领域含义长度不能超过1000个字符")
    private String domainMeaning;
    
    /**
     * 词解释条目列表
     */
    @Builder.Default
    private List<ExplanationEntry> explanations = new ArrayList<>();
    
    /**
     * 领域权重/相关性（0.0-1.0）
     * 表示该词在该领域中的重要程度
     */
    private Double domainRelevance;
    
    /**
     * 扩展信息（JSON格式，存储领域特定的元数据）
     */
    private java.util.Map<String, Object> metadata;
    
    /**
     * 创建时间
     */
    private LocalDateTime createdAt;
    
    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;
    
    /**
     * 添加解释条目
     */
    public void addExplanation(ExplanationEntry entry) {
        if (explanations == null) {
            explanations = new ArrayList<>();
        }
        if (entry != null) {
            entry.onCreate();
            explanations.add(entry);
        }
    }
    
    /**
     * 批量添加解释条目
     */
    public void addExplanations(List<ExplanationEntry> entries) {
        if (explanations == null) {
            explanations = new ArrayList<>();
        }
        if (entries != null && !entries.isEmpty()) {
            entries.forEach(this::addExplanation);
        }
    }
    
    /**
     * 设置创建时间戳
     */
    public void onCreate() {
        if (createdAt == null) {
            createdAt = LocalDateTime.now();
        }
        updatedAt = LocalDateTime.now();
        if (explanations != null) {
            explanations.forEach(ExplanationEntry::onCreate);
        }
    }
    
    /**
     * 设置更新时间戳
     */
    public void onUpdate() {
        updatedAt = LocalDateTime.now();
        if (explanations != null) {
            explanations.forEach(ExplanationEntry::onUpdate);
        }
    }
    
    /**
     * 获取有效解释条目数量
     */
    public int getValidExplanationCount() {
        if (explanations == null || explanations.isEmpty()) {
            return 0;
        }
        return (int) explanations.stream()
                .filter(ExplanationEntry::hasContent)
                .count();
    }
    
    /**
     * 检查是否有有效内容
     */
    public boolean hasContent() {
        return (domainName != null && !domainName.trim().isEmpty()) &&
               (explanations != null && !explanations.isEmpty() && 
                explanations.stream().anyMatch(ExplanationEntry::hasContent));
    }
}

